package com.ebelter.scaleblesdk.util;


/**
 * Created by ZCQ on 2017/11/9
 */

public class BytesUtils {

    private static final String TAG = "BytesUtils";
    /**
     * byte数组转换成16进制的字符串
     * <li>{2,17,22,127}---->[02 11 16 7F]<li/>*/
    public static String bytes2HexStr(byte[] data) {

        if (data==null||data.length==0){
            return "[ ]";
        }
        StringBuilder builder = new StringBuilder();
        builder.append("[");
        for (byte b : data) {
            builder.append(String.format("%02X",b)).append(" ");
        }
        builder.deleteCharAt(builder.lastIndexOf(" "));
        builder.append("]");
        return builder.toString();
    }

    public static String bytes2HexStr2(byte[] data) {

        if (data==null||data.length==0){
            return "";
        }
        StringBuilder builder = new StringBuilder();
        for (byte b : data) {
            builder.append(String.format("%02X",b));
        }
        return builder.toString();
    }


    /**int转byte[2]  与getIntFromByte16互成逆运算
     * 把int值存储在一个byte[]的数组里 用两个字节表示的，比如int a = 200;
     *实际得到的值应该是0x00C8,就是byte b[0] = 0x00,byte b[1] = C
     * int经测试是最大32737 63261
     * */
    public static byte[] getByteFromInt16(int integer) {
        int byteNum = (40 - Integer.numberOfLeadingZeros (integer < 0 ? ~integer : integer)) / 8;
        byte[] byteArray = new byte[2];
        try {
            for (int n = 0; n < byteNum; n++){
                byteArray[1 - n] = (byte) (integer >> (n * 8));
            }
            return (byteArray);
        }catch (Exception e){
            return byteArray;
        }

    }

    /**byte[2]转int16 上面的getByteFromInt16方法的逆运算*/
    public static int getIntFromByte16(byte[] data) {
        return ((data[1] & 0xff)) | ((data[0] & 0xff) << 8);
    }


    /**高低两字节组成int*/
    public static int getIntFrom2Byte(byte h,byte l) {
        return ((l & 0xff)) | ((h & 0xff) << 8);
    }

//
//    /** 计算效验,并加在校验位 DataByte是整体的包 即是带有2+2+body+2的包 */
//    public static byte[] addCheckCode(byte[] DataByte) {
//
//
//        int num = 0;
//        for (int i = 2; i < DataByte.length - 2; i++) {
//            num = (num + (DataByte[i] & 0xff)) % 0xffff;
//        }
//        //实际上num 这里已经是结果了，如果只是取int 可以直接返回了
//        byte[] Result = getByteFromInt16(num);
//        DataByte[DataByte.length - 2] = Result[0];
//        DataByte[DataByte.length - 1] = Result[1];
//        return DataByte;
//    }
//
//
//        /** 检测校验位 DataByte是整体的包 即是带有2+2+body+2的包 */
//        public static boolean checkCode(byte[] DataByte) {
//            int num = 0;
//            for (int i = 2; i < DataByte.length - 2; i++) {
//                num = (num + (DataByte[i] & 0xff)) % 0xffff;
//            }
//            //实际上num 这里已经是结果了，如果只是取int 可以直接返回了
//            byte[] Result = getByteFromInt16(num);
//        return DataByte[DataByte.length - 2] == Result[0]&&DataByte[DataByte.length - 1] == Result[1];
//
//    }


    /**
     * 计算某个字节的第几位是0还是1 也即是高低位
     * 例如 3（0000 0011）的第6位是1 即高位 从左右的
     * 例如 3（0000 0011）的第0位是0 即低位
     */
    public static int getByteHLByIndex(byte data,int index){

        int result;
        if (index==0){
            result=((data&0x80)>>7);
        }else if (index==1){
            result=((data&0x40)>>6);
        }else if (index==2){
            result=((data&0x20)>>5);
        }else if (index==3){
            result=((data&0x10)>>4);
        }else if (index==4){
            result=((data&0x08)>>3);
        }else if (index==5){
            result=((data&0x04)>>2);
        }else if (index==6){
            result=((data&0x02)>>1);
        }else if (index==7){
            result=((data&0x01));
        }else {
            throw new RuntimeException("运行时异常：data = "+data+"--index = "+index);
        }
        return result;
    }


    //判断
    public static boolean isEqualsBytes(byte[] b1,byte[] b2){
        if (b1==null && b2==null){
            return true;
        }

        if (b1!=null&&b2!=null&&b1.length==b2.length){

            //LogUtils.i(TAG,"b1 = "+bytes2HexStr(b1));
            //LogUtils.i(TAG,"b2 = "+bytes2HexStr(b2));

            for (int i=0;i<b1.length;i++){
                if(b1[i]!=b2[i]){
              //      LogUtils.i(TAG,"b1 与 b2 在i="+i+"处不相等");
                    return false;
                }
            }
            //LogUtils.i(TAG,"b1 与 b2 相等");
            return true;
        }

        return false;
    }


}
